/***********************************************************************************
 * 文件名： mcu_crc.c
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		CRC校验模块驱动。目前仅支持CRC32。
 * 修改记录：
 * 	2020/8/25: 初版。 刘言。
***********************************************************************************/
#include "HC32_LyLib.h"	
#include "mcu_crc.h"

#if (HC32_MCU_SERIES == HC32F005)   // HC32F005 支持CRC16

// 获取CRC16校验码
u16 Crc_GetCRC16(const u8 *buff, u32 length)
{
    u32 i;

    M0P_CRC->RESULT_f.RESULT = 0xFFFF;  // 初始化
    for(i = 0; i < length; i++)         // 写入数据
    {
       *((volatile uint8_t*)(&(M0P_CRC->DATA))) = buff[i];
    }
    return M0P_CRC->RESULT_f.RESULT;
}

// CRC16校验，校验码在数组最后2个字节（小端排列）
bool Crc_Verify16(const u8 *buff, u32 length)
{
    u32 i;

    M0P_CRC->RESULT_f.RESULT = 0xFFFF;
    for (i = 0; i < length; i++)
	{
        *((volatile uint8_t*)(&(M0P_CRC->DATA))) = buff[i];
	}
	return M0P_CRC->RESULT_f.FLAG;
}
#else   // 其它系列支持CRC32
// CRC32校验，校验码在数组最后4个字节（小端排列）
bool Crc_Verify32(const u8 *buff, u32 len)
{
    u32 i;

    M0P_CRC->CR_f.CR = 1;       // CRC32
    M0P_CRC->RESULT = 0XFFFFFFFF;
    for (i = 0; i < len; i++)
	{
        *((volatile uint8_t*)(&(M0P_CRC->DATA))) = buff[i];
	}
	return M0P_CRC->CR_f.FLAG;
}
#endif
